/***
 * Copyright (c) 2010 readyState Software Ltd
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

package com.readystatesoftware.mapviewballoons;

//import mapviewballoons.example.R;
import evan.zhang.flags.FlagsContext;
import evan.zhang.flags.FlagsMapActivity;
import evan.zhang.flags.R;

//import java.lang.reflect.Method;
//import java.util.List;

import android.graphics.drawable.Drawable;
//import android.util.Log;
//import android.view.MotionEvent;
import android.view.View;
//import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
//import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

/**
 * An abstract extension of ItemizedOverlay for displaying an information balloon
 * upon screen-tap of each marker overlay.
 * 
 * @author Jeff Gilfelt
 */
public abstract class BalloonItemizedOverlay<Item> extends ItemizedOverlay<OverlayItem> {

	private FlagsContext flagsContext;
	private FlagsMapActivity mapContext;
	private BalloonOverlayView balloonView;
	private View clickRegion;
	private int viewOffset;
	//protected MapController mc;
	
	
	/**
	 * Create a new BalloonItemizedOverlay
	 * 
	 * @param defaultMarker - A bounded Drawable to be drawn on the map for each item in the overlay.
	 * @param mapView - The view upon which the overlay items are to be drawn.
	 */
/*	public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) {
		super(defaultMarker);
		this.mapView = mapView;
		viewOffset = 0;
		//mc = mapView.getController();
	}
*/
	public BalloonItemizedOverlay(Drawable defaultMarker, FlagsContext flagsContext) {
		super(defaultMarker);
		this.flagsContext = flagsContext;
		//this.balloonView = new BalloonOverlayView(flagsContext, viewOffset);
		//this.clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
		this.viewOffset = 0;
	}
	
	public void init(FlagsMapActivity context) {
		this.mapContext = context;
		this.balloonView = new BalloonOverlayView(context, viewOffset);
		this.clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout);
	}
	
	public BalloonOverlayView getBalloonView() {
		return this.balloonView;
	}
	public View getClickRegion() {
		return this.clickRegion;
	}
	public int getViewOffset() {
		return this.viewOffset;
	}
	public FlagsContext getFlagsContext() {
		return this.flagsContext;
	}
	public FlagsMapActivity getMapContext() {
		return this.mapContext;
	}
	/**
	 * Set the horizontal distance between the marker and the bottom of the information
	 * balloon. The default is 0 which works well for center bounded markers. If your
	 * marker is center-bottom bounded, call this before adding overlay items to ensure
	 * the balloon hovers exactly above the marker. 
	 * 
	 * @param pixels - The padding between the center point and the bottom of the
	 * information balloon.
	 */
	public void setBalloonBottomOffset(int pixels) {
		viewOffset = pixels;
	}
	
	/**
	 * Override this method to handle a "tap" on a balloon. By default, does nothing 
	 * and returns false.
	 * 
	 * @param index - The index of the item whose balloon is tapped.
	 * @return true if you handled the tap, otherwise false.
	 */
	protected boolean onBalloonTap(int index) {
		return false;
	}

	/* (non-Javadoc)
	 * @see com.google.android.maps.ItemizedOverlay#onTap(int)
	 */
	public final boolean onTap(int index) {
		//Log.e("zzzzzzzzzzzzz", "onTap(int index) is called");
		//boolean isRecycled;
		//final int thisIndex;
		GeoPoint point = createItem(index).getPoint();
		String distDefault = flagsContext.getFlags().getDistsDefault().get(index);
		flagsContext.getFlags().findPlaceAndFillFlagInfo(distDefault,flagsContext.getResources());
		//if (balloonView == null) {
		//	balloonView = new BalloonOverlayView(flagsContext, viewOffset);
		//	clickRegion = 
		//	isRecycled = false;
		//} else {
		//	isRecycled = true;
		//}
		//balloonView.setVisibility(View.VISIBLE);
		balloonView.setData(flagsContext.getFlags());
	//	balloonView.setVisibility(View.VISIBLE);
		
		//balloonView.setData(createItem(index));
		//String countrySmall = "s_"+flagsContext.getFlags().getFlagInfo().getDistDefault().toLowerCase().replace(' ', '_');
		//Log.d(tag,"String countrySmall = "+countrySmall);
		//int resourceId = flagsContext.getResources().getIdentifier("evan.zhang.flags:drawable/"+countrySmall, null, null);
		//this.getBalloonView().setData(resourceId,flagsContext.getFlags().getFlagInfo().getDistLocal()+"  "+flagsContext.getFlags().getFlagInfo().getDistDefault(),flagsContext.getFlags().getFlagInfo().getCityLocal()+"  "+flagsContext.getFlags().getFlagInfo().getCityDefault());
		//this.balloonView.setData(flagsContext.getFlags());
		
		MapView.LayoutParams params = new MapView.LayoutParams(
				LayoutParams.WRAP_CONTENT, 
				LayoutParams.WRAP_CONTENT, 
			    point,
				MapView.LayoutParams.BOTTOM_CENTER);
		params.mode = MapView.LayoutParams.MODE_MAP;
		
		//setBalloonTouchListener(thisIndex);
		
	//	balloonView.setVisibility(View.VISIBLE);
		

		//if (isRecycled) {
		balloonView.setLayoutParams(params);
		//balloonView.setVisibility(View.VISIBLE);
		//} else {
		//	flagsContext.get.addView(balloonView, params);
		//}
	    
		
		this.getMapContext().getMapView().getController().animateTo(point);
		balloonView.setVisibility(View.VISIBLE);
		
		return true;
	}
	protected void hideBalloon() {
		if (balloonView != null) {
			balloonView.setVisibility(View.GONE);
		}
	}
	
	/**
	 * Hides the balloon view for any other BalloonItemizedOverlay instances
	 * that might be present on the MapView.
	 * 
	 * @param overlays - list of overlays (including this) on the MapView.
	 */
	/*
	private void hideOtherBalloons(List<Overlay> overlays) {
		
		for (Overlay overlay : overlays) {
			if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) {
				((BalloonItemizedOverlay<?>) overlay).hideBalloon();
			}
		}
		
	}
	
	/**
	 * Sets the onTouchListener for the balloon being displayed, calling the
	 * overridden onBalloonTap if implemented.
	 * 
	 * @param thisIndex - The index of the item whose balloon is tapped.
	 */
	/*
	private void setBalloonTouchListener(final int thisIndex) {
		
		try {
			@SuppressWarnings("unused")
			Method m = this.getClass().getDeclaredMethod("onBalloonTap", int.class);
			
			clickRegion.setOnTouchListener(new OnTouchListener() {
				public boolean onTouch(View v, MotionEvent event) {
					
					View l =  ((View) v.getParent()).findViewById(R.id.balloon_main_layout);
					Drawable d = l.getBackground();
					
					if (event.getAction() == MotionEvent.ACTION_DOWN) {
						int[] states = {android.R.attr.state_pressed};
						if (d.setState(states)) {
							d.invalidateSelf();
						}
						return true;
					} else if (event.getAction() == MotionEvent.ACTION_UP) {
						int newStates[] = {};
						if (d.setState(newStates)) {
							d.invalidateSelf();
						}
						// call overridden method
						onBalloonTap(thisIndex);
						return true;
					} else {
						return false;
					}
					
				}
			});
			
		} catch (SecurityException e) {
			Log.e("BalloonItemizedOverlay", "setBalloonTouchListener reflection SecurityException");
			return;
		} catch (NoSuchMethodException e) {
			// method not overridden - do nothing
			return;
		}

	}
	*/
	
}
